package com.itheima.d3_inner_class3;



/**
 * 匿名内部类
 * 就是一种特殊的局部内部类；所谓匿名：指的是程序员不需要为这个类声明名字。
 * 特点：匿名内部类本质就是一个子类，并会立即创建出一个子类对象。
 *
 * 作用：
 * 用于更方便的创建一个子类对象。
 * 匿名内部类通常作为一个参数传输给方法。
 *
 * 写法：
 * new  类或接口(参数值…) {
 * 类体(一般是方法重写)；
 * };
 *
 */
/**
 * 学习完匿名内部类的基本使用之后，我们再来看一下匿名内部类在实际中的应用场景。其实一般我们会主动的使用匿名内部类。
 *只有在调用方法时，当方法的形参是一个接口或者抽象类!!!!!
 * 为了简化代码书写，才会直接传递匿名内部类对象给方法。这样就可以少写一个类。
 */

public class Test2 {
    public static void main(String[] args) {
        // 目标：掌握匿名的常见使用场景。
        /**
         * 解析执行过程：
         * 先是把匿名内部类生成的：swimming接口的实现类（或者叫生成的子类）。交给swimming类型的变量s1
         * 然后s1调用go方法，由go方法里面的swimming类型形参接收s1变量
         * 接着在go方法里面，s1变量调用swim方法。此时，会去找真正送进来的对象，也就是匿名内部类的这个实现类，所重写的swim方法来执行
         */
        Swimming s = new Swimming(){
            @Override
            public void swim() {
                System.out.println("鸟飞快~~~~");
            }
        };
        go(s);

        /**
         * 把上面的写法简化：
         *把 匿名内部类生成的子类直接当做参数给go方法
         * new Swimming(){
         *             @Override
         *             public void swim() {
         *                 System.out.println("鸟飞快~~~~");
         *             }
         *         };
         *
         */

        go(new Swimming(){   //匿名内部类通常作为一个参数传输给方法。 或者说匿名内部类是作为一个实现类对象传给go方法对应的参数
            @Override
            public void swim() {
                System.out.println("狗🏊‍飞快~~~~");
            }
        });

        go(new Swimming() {
            @Override
            public void swim() {
                System.out.println("我就不跑");
            }
        });


    }

    // 设计一个方法，可以接收swimming接口的一切实现类对象进来参加游泳比赛。
    public static void go(Swimming s){
        System.out.println("开始-----------------------");
        s.swim();   //执行的时候，会去找送进来的对象所重写的swim方法
    }
}



// 猫和狗都要参加游泳比赛
interface Swimming{
    void swim();
}
